const dayjs = require('dayjs');
/**
 * 状态机测试Store
 * 用于开发环境中测试和演示状态机功能
 */

import { observable, action } from 'mobx-miniprogram';

/**
 * 状态机测试Store
 */
export const stateMachineTestStore = observable({
  // 当前测试项目
  project: null,
  
  // 当前角色
  currentRole: '',
  
  // 模拟角色
  simulatedRole: '',
  
  // 可用事件列表
  availableEvents: [],
  
  // 测试状态
  testState: {
    status: 'idle', // 'idle', 'running', 'completed', 'error'
    message: '',
    testResults: []
  },
  
  // 设置项目
  setProject: action(function(project) {
    this.project = project;
    this.loadAvailableEvents();
  }),
  
  // 设置当前角色
  setCurrentRole: action(function(role) {
    this.currentRole = role;
    this.loadAvailableEvents();
  }),
  
  // 模拟角色
  simulateRole: action(function(role) {
    this.simulatedRole = role;
    this.loadAvailableEvents();
  }),
  
  // 获取当前角色（实际角色或模拟角色）
  get getCurrentRole() {
    return this.simulatedRole || this.currentRole || 'visitor';
  },
  
  // 加载可用事件
  loadAvailableEvents: action(function() {
    // 模拟加载可用事件
    // 在实际场景下，根据项目状态和用户角色加载不同的事件
    console.log('状态机测试Store: 加载可用事件');
    
    if (!this.project) {
      this.availableEvents = [];
      return;
    }
    
    // 模拟数据
    this.availableEvents = [
      { id: 'approve', name: '审批通过', roles: ['manager', 'director'] },
      { id: 'reject', name: '驳回', roles: ['manager', 'director'] },
      { id: 'submit', name: '提交', roles: ['user'] }
    ].filter(event => event.roles.includes(this.getCurrentRole));
  }),
  
  // 执行事件
  executeEvent: action(function(eventId, params = {}) {
    console.log(`状态机测试Store: 执行事件 ${eventId}`, params);
    
    // 模拟事件执行
    // 在实际场景下，会调用后端API执行状态转换
    
    // 记录测试结果
    this.testState.testResults.push({
      eventId,
      params,
      timestamp: dayjs(),
      success: true
    });
    
    return Promise.resolve({
      success: true,
      message: `事件 ${eventId} 执行成功`
    });
  }),
  
  // 运行测试
  runTest: action(function(testCase) {
    this.testState.status = 'running';
    this.testState.message = '测试运行中...';
    this.testState.testResults = [];
    
    console.log('状态机测试Store: 开始运行测试', testCase);
    
    // 模拟运行测试用例
    setTimeout(() => {
      this.testState.status = 'completed';
      this.testState.message = '测试完成';
      
      // 添加一些模拟测试结果
      this.testState.testResults.push({
        name: '基本功能测试',
        timestamp: dayjs(),
        success: true
      });
    }, 1000);
  }),
  
  // 重置测试状态
  resetTest: action(function() {
    this.testState.status = 'idle';
    this.testState.message = '';
    this.testState.testResults = [];
  })
});

/**
 * 状态机测试助手
 */
export const stateMachineTestHelper = {
  // 运行单个测试
  runSingleTest(testName, testFn) {
    console.log(`开始测试: ${testName}`);
    try {
      const result = testFn();
      console.log(`测试通过: ${testName}`);
      return { name: testName, success: true, result };
    } catch (error) {
      console.error(`测试失败: ${testName}`, error);
      return { name: testName, success: false, error: error.message };
    }
  },
  
  // 运行测试套件
  runTestSuite(suiteName, tests) {
    console.log(`======= 测试套件: ${suiteName} =======`);
    const results = tests.map(test => this.runSingleTest(test.name, test.fn));
    const passed = results.filter(r => r.success).length;
    console.log(`测试完成: ${passed}/${tests.length} 通过`);
    return results;
  }
};

export default {
  stateMachineTestStore,
  stateMachineTestHelper
}; 